package ar.com.aterrizar.entidades;


import java.util.ArrayList;
import java.util.Collection;

import org.uqbar.commons.utils.Observable;
import org.uqbar.commons.utils.Transactional;

import ar.com.aterrizar.asientos.Asiento;
import ar.com.aterrizar.exception.VueloYaReservadoException;
import ar.com.aterrizar.operaciones.Compra;

@Transactional
@Observable
public class Cliente {

	private String nombre;
	private String apellido;
	private Integer dni;
	private Categoria idCategoria;
	private Buscador buscador;
	private Boolean cuenta;
	private Compra compra;
	private Collection<Asiento>asientosReservados = new ArrayList<Asiento>();
	

	public Cliente(String nombre, String apellido, int dni,
			Categoria idCategoria, Boolean cuenta) {

		this.nombre = nombre;
		this.apellido = apellido;
		this.dni = dni;
		this.idCategoria = idCategoria;
		this.cuenta = cuenta;
		this.compra = new Compra();
	}

	/**
	 * Solo para test
	 */
	public Cliente(Categoria categoria){
		
		this.nombre = "Eduardo";
		this.apellido = "Tuzzio";
		this.dni = 25789543;
		this.idCategoria = categoria;
		this.cuenta = true;
		this.compra = new Compra("OC888",2);
		
	}
	
	public Compra getCompras(){
		return this.compra;
	}
	
	public String getNombre() {
		return nombre;
	}

	public String getApellido() {
		return apellido;
	}

	public Integer getDni() {
		return dni;
	}

	public void setCategoria(Categoria categoria) {
		this.idCategoria = categoria;
	}

	public Categoria getIdCategoria() {
		return idCategoria;
	}

	public void setBuscador(Buscador b) {
		buscador = b;
	}

	public Buscador getBuscador() {
		return this.buscador;
	}

	public Boolean sosVip() {
		return this.idCategoria.equals(Categoria.VIP);
	}

	public Boolean tenesCuenta() {
		return this.cuenta;
	}

	public Integer recargoDeCuenta() {
		return (tenesCuenta())? 0 : 20;
	}

	public void comprarPasaje(Asiento asiento) {
		this.compra.comprarPasaje(asiento, this);
		this.asientosReservados.remove(asiento);//Elimina el asiento de la lista de reservados en caso de que este reservado
	}

	public void cambiarCategoria() {
		if (!(sosVip()) && compra.getMontoGastado() > 100000) {
			setCategoria(Categoria.VIP);
		}
	}
	public Collection<Asiento> getAsientosReservados(){
		return this.asientosReservados;
	}
	public void reservar(Asiento asiento){
		Aeropuerto.getInstance().reservar(asiento, this);
		this.asientosReservados.add(asiento);
	}
}
